package com.study.io.bio.demo.input;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.util.Arrays;

/**
 * 文件输入流 读出文件内容
 *
 * @author wuxj
 */
public class FileInputStreamDemo {

    public static void main(String[] args) throws IOException {

        File file = new File("d://321.txt");
        if (!file.exists()) {
            throw new RuntimeException("要读取的文件不存在");
        }

        //调用读取流对象的读取方法
        //1.read()返回的是读取到的字节
        //2.read(byte[] b)返回的是读取到的字节个数

        //1.
        //创建文件字节读取流对象时，必须明确与之关联的数据源。
        FileInputStream fis1 = new FileInputStream(file);
        int by1 = 0;
        while ((by1 = fis1.read()) != -1) {
            System.out.println("读取一个字节：" + by1);
        }

        //2.
        //创建文件字节读取流对象时，必须明确与之关联的数据源。
        FileInputStream fis2 = new FileInputStream(file);
        byte[] buf2 = new byte[3];
        //len记录的是往字节数组里存储的字节个数
        int len2 = fis2.read(buf2);
        //只是转成了字符串的表现形式
        System.out.println("读取三个字节：" + len2 + "...." + Arrays.toString(buf2));
        //转成字符串
        System.out.println("读取三个字节并且转成字符串：" + len2 + "...." + new String(buf2, 0, len2));


        //创建一个字节数组，定义len记录长度
        //创建文件字节读取流对象时，必须明确与之关联的数据源。
        FileInputStream fis3 = new FileInputStream(file);
        int len3 = 0;
        byte[] buf3 = new byte[256];
        while ((len3 = fis3.read(buf3)) != -1) {
            System.out.println("一次读取256个字节：" + new String(buf3, 0, len3));
        }

        //创建文件字节读取流对象时，必须明确与之关联的数据源。
        FileInputStream fis4 = new FileInputStream(file);
        FileChannel fileChannel = fis4.getChannel();
        //通过buffer读取数据
        ByteBuffer byteBuffer2 = ByteBuffer.allocate(256);
        fileChannel.read(byteBuffer2);
        byteBuffer2.flip();
        System.out.println("通过buffer一次读取256个字节：" + new String(byteBuffer2.array()));


        //关资源
        fis1.close();
        fis2.close();
        fis3.close();
        fis4.close();
    }
}
